Language Picker topic

Language Picker

Language Picker package is useful when we need to display a list of languages and select one of them. There are possible customizations such as passing a custom title, language service and a right icon.

Widgets

Within the language_picker package you can call the showChangeLanguageBottomSheet function in order to show your language list.

showChangeLanguageBottomSheet

The showChangeLanguageBottomSheet function is a convenience function for displaying a ChangeLanguageWidget modal sheet with some pre-configured options.

The service receives an implementation of the LanguageService class. The API of the class provides methods for the logic of fetching a list of languages, setting and getting the current one and getting all of them. The onChanged parameter accepts a function, which receives the value of the selected language, which can be used to update the value of the MaterialApp(locale) parameter of the app, The translate parameter receives a function, which accepts the selected language model and based on a value of its parameters returns a translated string of the name of the language. The itemBuilder parameter accepts a function, which should return a Widget to display the SelectedLanguageModel data. The loading parameter accepts the value for the current SelectedLanguageModel.isLoading model. With the errorBuilder parameter you can provide a function, which receives an exception model, which implements ErrorModel. ErrorModel is the type of error coming from the LanguagePickerBloc error state. In order to map other types of exceptions, you should provide an errorBuilder, with handling of the error. The headerBuilder parameter receives the title widget of the language picker. With the modalConfiguration we can change the default configuration of the showBlurredBottomSheet(). To do that should provide a LanguagePickerConfiguration() instance to override the default values. There are different states for the error message widget. The default state is MessagePanelState.important. With the messageState you can provide one of the enum values. MessagePanelError widget, is displayed above the languages list, when there is an error with a default icon. To access one of the other preconfigured icons, instead of the danger icon displayed in the error panel on the left of the error text, for the value of the parameter messageState provide another MessagePanelState value, such as: MessagePanelState.informative. According to messageState, the appropriate icon, color and background color of the error panel widget are displayed. In order to override the error panel icon with a custom icon, you should use the copyWith method of the WidgetToolkitTheme, such as: WidgetToolkitTheme.light.copyWith( dangerIcon: Assets.customIcon, );

How to use

In order to start using this package you need to add the dependency to the widget_toolkit in your pubspec.yaml file.

widget_toolkit: any

After that you can import the package with the following line:

import 'package:widget_toolkit/language_picker.dart';

Additional step is the requirement to add the LanguagePickerTheme and WidgetToolkitTheme as
extensions to your ThemeData.

Here is an example:

//theme 
//...
MaterialApp(
  theme: ThemeData(
    extensions: [
      darkMode ? WidgetToolkitTheme.dark : WidgetToolkitTheme.light,
      darkMode ? LanguagePickerTheme.dark : LanguagePickerTheme.light,
    ]
  )
);
//..

In order to fetch the models you want to present in the bottom sheet dialog you need to implement your LanguageService:

class MyCustomLanguageService implements LanguageService {
  MyCustomLanguageService();

  @override
  Future<List<LanguageModel>> getAll() async => [...get all language models];

  @override
  Future<LanguageModel> getCurrent() async => [...get current language model];

  @override
  Future<void> setCurrent(LanguageModel language) async => [...set current language model];

  @override
  Future<List<SelectedLanguageModel>> getLanguageList() async => [...get selected language models];
}

Minimal example for showItemPickerBottomSheet usage:

showChangeLanguageBottomSheet(
  context: context,
  service: context.read<LanguageServiceExample>(),
  onChanged: (language) => print('Selected language: $language'),
  translate: (model) => _translatesTheNameOfTheLanguage(model),
);

Complete example for showItemPickerBottomSheet usage:

showChangeLanguageBottomSheet(
  context: context,
  service: context.read<LanguageServiceExample>(),
  onChanged: (language) => print('Selected language: $language'),
  itemBuilder: (item, isLoading, context) => _buildLanguageItem(item, isLoading, context),
  translate: (model) => _translatesTheNameOfTheLanguage(model),
  headerBuilder: (context) => _buildCustomHeaderBuilder(context),
    modalConfiguration: const LanguagePickerModalConfiguration(
      safeAreaBottom: false,
      contentAlignment: MainAxisAlignment.end,
      fullScreen: false,
      haveOnlyOneSheet: true,
      showHeaderPill: false,  
      showCloseButton: false,
      heightFactor: 0.6,
      dialogHasBottomPadding: false,
      isDismissible: true,
    ),
  errorBuilder: (myException) => _buildCustomErrorBuilder(myException),
  messageState: MessagePanelState.informative,
);